//
//  main.m
//  02-ClassCode
//
//  Created by dllo on 16/7/5.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"
int main(int argc, const char * argv[]) {
    
    // 1.快捷键
    // command + 0                  开/收起左边栏
    // command + option(Alt) + 0    开/收右边栏
    // command + shift + y          开/收下边栏
    // command + R                  运行
    // command + C                  复制
    // command + V                  粘贴
    // command + Z                  撤销
    // command + shift + Z          取消撤销
    // command + B                  编译
    // command + N                  新建一个文件
    // command + shift + N          新建一个工程
    
    
    // 2.移动光标
    // command + ←                  移动到当前行的最前边
    // command + →                  移动到当前行的最右边
    // command + ↑                  移动到所有行的第一行的起始位置
    // command + ↓                  移动到所有行的最后一行的起始位置
    
    
    // 3.选中文字
    // shift + ←                    选中向左一个字
    // shift + →                    选中向右一个字
    // shift + ↑                    从当前光标位置开始, 选中向上一行, 对应的位置
    // shift + ↓                    从当前光标位置开始, 选中项下一行, 对应的位置
    
    
    // command + shift + ←          选中从光标开始, 左边所有的文字
    // command + shift + →          选中从光标开始, 右边所有的文字
    // command + shift + ↑          选中从光标开始, 上边所有的文字
    // command + shift + ↓          选中从光标开始, 下边所有的文字
    
    
    // 1. 类和对象
    // 类: 一个具有相同特征和行为的事物抽象的集合
    // 对象: 类的实例, 也称作类的实现
    // 面向对象的思想, 万物皆对象.
    // 面向对象语言是面向对象思想的具体体现.
    // OOP 面向对象编程
    // OOD 面向对象设计
    // 面向对象三大特征(特性): 封装, 继承, 多态; 提高代码的复用
    
    
    // 2. Objective-C ( OC )
    // 与C语言的区别
    // OC属于C语言的扩展
    // OC有类的概念
    // OC中声明属性的方法在和方法在 .hzhong
    // OC中具体实现在 .m中
    // .mm 是C++的文件, 在这个文件中可以编写C++代码
    
    // OC中的根类 NSObject
    
    
    // 3. 创建OC的实例
    // [1] 消息语法 [objc doSomething];
    // 向objc对象去发送一个doSomething的方法, 让他去调用
    // 类方法的调动(由类名去调用对应的加号方法)
    // + alloc 开辟内存空间
    NSObject *objc = [NSObject alloc];
    // 实例方法的调用
    // -init
    NSObject *newObjc = [objc init];
    
    
    // 创建一个Person对象
    Person *per = [[Person alloc] init];
    
    // 公开的成员可以直接通过->赋值 ->取值
    per->_age = 10;
    per.age = 98;
    [per setName:@"lisi"];
    per.name = @"zhangsan";
    
    
   
 
    
    NSLog(@"%ld", per->_age);
    
    // 受保护的成员不能通过->去访问
    //id(任意类型) 与 instancetype
    //instancetype   在作为参数返回值的时候与id是一样的，系统编译器会吧id类型转换成instancetype（即当前对象类型）
    //id可以作为变量去使用，但instancetype不可以
    id object = [[NSObject alloc] init];
    [[Person alloc] init];

    [object description];
    
    Fraction *fra1 = [[NSObject alloc]init];
    
    Fraction *fra2 = [[NSObject alloc]init];
    
    
    
    
    
    
    
    
    return 0;
}




//
//  Person.h
//  OC02_类和对象
//
//  Created by Hanlingyu on 16/7/5.
//  Copyright © 2016年 ltq. All rights reserved.
//

#import <Foundation/Foundation.h>  // 引用系统数据类库

@interface Person1 : NSObject

// 大括号中所包含的是类的成员变量(实例变量)
{
    // @protected   受保护的, 类本身及其子类
    // @public      公开的, 让外界可以访问
    // @private     私有的, 只有本类可以访问
    // 默认是受保护的
    // package 一般系统内部使用, 很少用
    
    
    NSString *_name;
@public
    NSInteger _age;
    
}

// 方法分为两种:
// '+'方法: 类方法(由类调用)
// '-'方法: 实例方法(由对象去调用)

// C语言的函数 返回值 函数名(参数列表)
void func(int a);

// 返回值类型 方法名: 参数
- (void)sleep:(NSInteger)time;




- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setAge:(NSInteger)age;
- (NSInteger)age;


- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age;

+ (instancetype)personOfName:(NSString *)name
                         age:(NSInteger)age;














@end